/*
 * @Author: zzh
 * @Date: 2021-08-17
 * @FilePath: \service\app.js
 */
import path from 'path'
import Koa from 'koa'
const app = new Koa()
import views from 'koa-views'
import json from 'koa-json'
import onerror from 'koa-onerror'
import compress from 'koa-compress' //压缩
import koaBody from 'koa-body'

import logger from 'koa-logger'
import koaJwt from 'koa-jwt' //路由权限控制
import cors from 'koa2-cors'
import {
    accessLogger,
    appLogger
} from './logger'
// const Redis = require('./utils/redis');
// import sequelize from '@/database/sequelize'

import Conf from './config'
import responseFormat from './middleware/format_response'

import project from './app/index'
// global.redis = new Redis(); // 将redis挂载到全局，使用的时候可以直接redis.set,redis.get,redis.delete
/* redis 使用demo */
// redis.set('myname','fff',1) //改值的过期时间为1天，超过访问返回null，不设过期天数走redis的过期策略
// console.log(await redis.get('myname'));
// redis.delete('myname');
app.use(cors()); // cors跨域注册

// error handler
onerror(app)

// compress data
app.use(compress({
    filter: function(content_type) { //只有在请求的content-type中有gzip类型，我们才会考虑压缩，因为zlib是压缩成gzip类型的
        return /(text)|(js)/i.test(content_type);
    },
    threshold: Conf.compress.threshold, //阀值，当数据超过2kb的时候，可以压缩
    flush: require('zlib').constants.Z_SYNC_FLUSH
}));

//是否启用gzip压缩
app.use(async(ctx, next) => {
    ctx.compress = Conf.compress.isCompress; //是否压缩数据
    await next();

});

app.use(json())
app.use(logger())


app.use(koaBody({
    multipart: true,
    formidable: {
        keepExtensions: Conf.multipart.keepExtensions, // 保留文件扩展名
        maxFileSize: Conf.multipart.maxFileSize // 设置上传文件大小最大限制，默认2M
    }
}));

app.use(require('koa-static')(__dirname + '/public'))

app.use(responseFormat) //响应数据格式化返回

//秘钥
app.use(koaJwt({
    secret: Conf.jwt.jwtSecret,
    // passthrough: true
}).unless({
    path: Conf.jwt.rule
}))

app.use(views(__dirname + '/views', {
    extension: 'pug'
}))

app.use(accessLogger())

// logger
// app.use(async (ctx, next) => {
//     const start = new Date()
//     await next()
//     const ms = new Date() - start
//     console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
// })

// routes
// 路由注册
app.use(project.routes(), project.allowedMethods())
    // error-handling
app.on('error', (err, ctx) => {
    console.error('server error', err, ctx)
        //开发环境才记录日志
    if (process.env.NODE_ENV !== 'dev') {
        appLogger.error(err)
    }
});

module.exports = app